package com.suray.rgv;

import com.suray.basic.wcs.path.core.Node;
import com.suray.rgv.data.RgvSMInfoData;
import com.suray.wcs.res.enums.RgvStatus;

import java.io.IOException;
import java.util.List;

/**
 * 子母车功能接口，继承RgvInterface，有小车的基本功能接口以及子母车的特殊功能接口。
 */
public interface RgvSMInterface extends Rgv60Interface {

    /**
     * 获取小车信息
     * @return
     */
    RgvSMInfoData getRgvSMInfoData();

    /**
     * 生成子车任务, 任务启动
     * @param taskId
     * @param rgvSonTaskId
     * @param nodeList
     * @param pathIndexs
     * @param startTask
     */
    void sonRgvSendTask(Object taskId, int rgvSonTaskId, List<Node> nodeList, int[] pathIndexs, boolean startTask)
            throws IOException;

    /**
     * 启动子车任务
     * @throws IOException
     */
    void sonRgvTaskStart() throws IOException;

    /**
     * 根据子车任务id获取已完成的段序号
     * @param resTaskId
     * @param taskTime
     * @return
     */
    int getRgvSonEndSegment(int resTaskId, long taskTime);

    /**
     * 子车任务是否结束
     *
     * @param wcsTaskId
     * @param resTaskId
     * @param taskTime
     * @return
     */
    boolean isRgvSonTaskEnd(int wcsTaskId, int resTaskId, long taskTime);

    /**
     * 写入地图节点信息
     * @param nodes
     */
    void setMapNodes(List<Node> nodes);

    /**
     * 更新点位信息
     * @param node
     */
    void updateMapNode(Node node);

    /**
     * 获取子车当前的条码
     * @return
     */
    String getSonRgvGroundCode();

    /**
     * 子车是否在母车里面
     * 查询前需主动刷新子车状态，否则返回的结果可能不是当前的
     * @return
     */
    boolean isSonRgvInMother();

    /**
     * 子车按速度行驶
     * @param direction
     */
    void sonRgvMoveBySpeed(Integer direction);

    /**
     * 按速度停止
     */
    void stopSonRgvMoveBySpeed();

    /**
     * 子车按位移行驶
     * @param direction
     */
    void sonRgvMoveByDistance(Integer direction);

    /**
     * 子车故障恢复
     */
    void sonRgvRecovery();

    /**
     * 子车充电
     */
    void sonRgvCharge();

    /**
     * 子车停止充电
     */
    void sonRgvStopCharge();

    /**
     * 子车速度配置修改
     * @param moveSpeed
     * @param moveSpeedAcc
     * @param moveSpeedDec
     */
    void sonRgvChangeSpeedConfig(Integer moveSpeed, Integer moveSpeedAcc, Integer moveSpeedDec);

    /**
     * 小车方向
     * x增大方向
     * 为右：true
     * 为左：false
     */
    void setSonRgvDirectionX(Boolean rgvDirection);

    /**
     * 小车方向
     * y增大方向
     * 为右：true
     * 为左：false
     */
    void setSonRgvDirectionY(Boolean rgvDirection);

    /**
     * 子车校准
     */
    void sonRgvCalibration();

    /**
     * 获取母车上面的子车条码
     * @return
     */
    String getSonGroundCodeInMother();

    /**
     * 写入母车上子车条码
     * @param sonGroundCodeInMother
     */
    void setSonGroundCodeInMother(String sonGroundCodeInMother);

    /**
     * 当前是否有未完成的任务
     * @return
     */
    boolean hasTask();

    /**
     * 结束任务
     * @param taskId
     */
    void endTask(Object taskId);

    /**
     * 母车所有下发的任务是否都完成了
     * @return
     */
    boolean isAllSendTaskEnd();

    /**
     * 设置故障
     * @param message
     */
    void setError(String message);

    /**
     * 清除子车任务
     */
    void sonRgvClearTask();

    /**
     * 获取子车状态
     * @return
     */
    RgvStatus getSonRgvStatus();

    /**
     * 获取子车异常码
     * @return
     */
    int getSonRgvTaskErrorCode();

    /**
     * 启用子车
     */
    void enableSonRgv();

    /**
     * 停用子车
     */
    void disableSonRgv();

    /**
     * 获取母车状态
     * @return
     */
    boolean isMotherOnline();

    /**
     * 物理检测子车是否在母车内
     * @return
     */
    boolean isSonRgvInMotherNoComm();

    /**
     * 子车任务是否异常
     * @return
     */
    boolean isSonRgvTaskError();

    /**
     * 更改子车
     * @param rgvSon
     */
    void changeSonRgv(Object rgvSon);
}
